"""
@name : 10-多进程-数据共享
@author : wenyao
@projectname: xsfh
"""
from multiprocessing import Process, Manager, Lock
import time

def func(i,temp):
    with lock:
        temp[0] += 100
        time.sleep(1)
        print(i,"---------->",temp[0])

#使用manager  父进程要等待子进程结束再退出
#使用socket方式实现
lock = Lock()
if __name__ == "__main__":
    manager = Manager()
    temp = manager.list([1,2,3])
    p_list = []
    for i in range(10):
        p = Process(target=func,args=(i,temp))
        p.start()
        p_list.append(p)

    for i in p_list:
        i.join()

#队列
# from multiprocessing import Process,Queue
# import time
#
# def func(i,q):
#     if not q.empty():
#         print(i,"-->get value,",q.get())
#     time.sleep(2)
#
# #先进先出
# if __name__ == "__main__":
#     q = Queue()
#     for i in range(6):
#         q.put(10-i)
#         p = Process(target = func, args=(i,q))
#         p.start()


#进程通信的方式：
#队列
#socket
#共享内存
#管道
#信号
#信号量

#ipcs
# 1. 管道pipe：管道是一种半双工的通信方式，数据只能单向流动，而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 2. 命名管道FIFO：有名管道也是半双工的通信方式，但是它允许无亲缘关系进程间的通信。
# 4. 消息队列MessageQueue：消息队列是由消息的链表，存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 5. 共享存储SharedMemory：共享内存就是映射一段能被其他进程所访问的内存，这段共享内存由一个进程创建，但多个进程都可以访问。共享内存是最快的 IPC 方式，它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制，如信号两，配合使用，来实现进程间的同步和通信。
# 6. 信号量Semaphore：信号量是一个计数器，可以用来控制多个进程对共享资源的访问。它常作为一种锁机制，防止某进程正在访问共享资源时，其他进程也访问该资源。因此，主要作为进程间以及同一进程内不同线程之间的同步手段。
# 7. 套接字Socket：套解口也是一种进程间通信机制，与其他通信机制不同的是，它可用于不同及其间的进程通信。
# 8. 信号 ( sinal ) ： 信号是一种比较复杂的通信方式，用于通知接收进程某个事件已经发生。

#消息中间件 ： kafka   rabibitmq   nsq  redis
#filebeat  -- 》 生产者收集日志
#kafka --》 存储原始日志
#python程序 --》消费者，从kafka里获取日志，并进行分析 存入数据库